<?php
/**
 * Парсинг данных полученных от КиноПоиска
 *
 * @author Di_Moon
 */
class parserKinoPoisk {
    protected $kinopoisk_raw;            // данные полученные от кинопоиска
    protected $skipWords = array("...", "слова", "сборы");       // массив слов, которые будут пропущены при парсинге
    
    function __construct($raw_data) {
        $this->kinopoisk_raw = $raw_data;
    }
    
    // Функция по поиску информационно таблицы фильма
    function getInfoTable() {
        $regexp = "'<table class=\"info(.*?)\">(.*?)</table>'si";
        if(preg_match($regexp, $this->kinopoisk_raw, $matches)) {
            return $matches[2];
        }
        return null;
    }
    
    // Функция по парсингу информационной таблицы фильма
    function parseInfoTable($table_data) {
        $rv = array();
        $regexp = "'<td(.*?)>(.*?)</td>(.*?)<td(.*?)>(.*?)</td>'si";
        if(preg_match_all($regexp, $table_data, $info_data)) {
            $fields = $info_data[2];        // Информационные поля, полученные из таблицы
            $values = $info_data[5];        // Значения полей
            
            // Заполним выходной массив данными, убрав из них тэги
            for($i=0; $i<sizeof($fields); $i++) {
                $value = $values[$i];
                // Если в данных есть теги то отпарсим их, возвращаются только 
                // значения этих тегов, но сначала исключим "особые поля"
                if(strcmp($fields[$i], "время")==0) {
                    preg_match("/(\d+)/", $value, $pmTime);
                    $value = $pmTime[1];
                } elseif($fields[$i]=="зрители") {
                    // зрителей парсить не будем
                    continue;
                } elseif(preg_match("'<a(.*?)>'si", $value)) {
                    $value = $this->parseTag("a", $value);
                } elseif (preg_match("'<span(.*?)>'si", $value)) {
                    $value = $this->parseTag("span", $value);
                } elseif (preg_match("'<div(.*?)>'si", $value)) {
                    $value = $this->parseTag("div", $value);
                }
                
                $rv[$fields[$i]] = trim($this->replaceSpecial($value));
            }
            
            return $rv;
        }
    }
    
    // Функция по замене спец значений
    function replaceSpecial($string) {
        foreach(_parserKinoPisk_replaces() as $pattern=>$replace) {
            $string = str_replace($pattern, $replace, $string);
        }
        return $string;
    }
    
    // Функция по получению значений между тегами %tag
    function parseTag($tag, $data, $delimiter=", ") {
        $rv = "";
        $regexp = "'<$tag(.*?)>(.*?)</$tag>'si";
        if(preg_match_all($regexp, $data, $matches) > 0) {
            $values = $matches[2];
            $size = sizeof($values);
            for($i=0; $i<$size; $i++) {
                if(in_array($values[$i], $this->skipWords)) continue;
                $rv .= $values[$i].$delimiter;
            }
        } return substr($rv, 0, strlen($rv)-strlen($delimiter));
        return trim(str_replace("&nbsp;", " ", $data));
    }
    
    // Функция по получению списка актёров
    function getActorsList($delimiter=", ") {
        $rv = "";
        $regexp = "'<li itemprop=\"actors\"><a(.*?)>(.*?)</a></li>'si";
        if(preg_match_all($regexp, $this->kinopoisk_raw, $matches) > 0) {
            for($i=0;$i<sizeof($matches[2]);$i++) {
                $actor = $matches[2][$i];
                if(in_array($actor, $this->skipWords)) continue;
                $rv .= $actor.$delimiter;
            }
            
            return substr($rv, 0, strlen($rv)-strlen($delimiter));
        }
    }

    // Функция получения названия фильма на русском
    function getFilmNameRus() {
        $regex = "'<h1 class=\"moviename-big\" itemprop=\"name\">(.*?)</h1>'si";
        if(preg_match($regex, $this->kinopoisk_raw, $matches)) {
            return trim($this->replaceSpecial($matches[1]));
        }
        return "";        
    }

    // Функция получения названия фильма
    function getFilmName() {
        $regex = "'<span itemprop=\"alternativeHeadline\">(.*?)</span>'si";
        if(preg_match($regex, $this->kinopoisk_raw, $matches)) {
            return trim($this->replaceSpecial($matches[1]));
        }
        return "";        
    }

    // Функция получения рейтинга фильма
    function getFilmRating() {
        $regex = "'<span class=\"rating_ball\">(.*?)</span>'si";
        if(preg_match($regex, $this->kinopoisk_raw, $matches)) {
            return trim($this->replaceSpecial($matches[1]));
        }
        return 0;
    }
    
    // Функция получения описания фильма
    function getFilmDescription() {
        $regex = "'<div class=\"brand_words\" itemprop=\"description\">(.*?)</div>'si";
        if(preg_match($regex, $this->kinopoisk_raw, $matches)) {
            return trim($this->replaceSpecial($matches[1]));
        }
        return 0;
    }
}

?>
